/**
 * @file config.h
 * @brief 
 *      此文件定义了 Config 类，
 *          用于读取、存储仿真参数，
 *          同时包含一些仿真过程中可能会用到的一些辅助函数，
 *          同时包含一些全局的临时变量
 */
#pragma once

#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <filesystem>
#include <fstream>
#include <chrono>
using namespace std;

#define CELL_NUM 50

class Config {
public:
    // 基础参数
    double time_step;       // 时间步长 s  
    double simulate_time;   // 模拟时长 s
    double cell_length;     // 网格长度 m
    double pipe_length;     // 管道长度 m
    double pipe_diameter;   // 管道直径 m
    double temp_env;        // 环境温度 K
    bool vm_total_only;     // 是否只输入总输量
    double vm_gas;           // 入口气输量 kg/s
    double vm_liq;           // 入口液输量 kg/s
    double vm_total;        // 入口总输量 kg/s
    double heat_coef;       // 传热系数 W/(m2·K)

    // 衍生参数
    double pipe_radius;     // 管道半径 m
    double pipe_perimeter;  // 管道周长 m
    double pipe_area;       // 管道横截面积 m^2
    double pipe_volume;     // 管道体积 m^3
    double cell_volume;     // 网格体积 m^3
    int cell_num;           // 网格数 

    // 初值
    double P_exit;          // 出口压强 Pa
    double T_entrance;      // 入口温度 K

    // 使用chrono库记录时间
    chrono::time_point<chrono::system_clock> start_time;

    // 输出路径
    static constexpr double output_step_length = 0.1;    // 输出步长 m
    static constexpr double g = 9.8;                     // 重力加速度 m/s^2
    string tab_file_path = "./test2.tab";
    string output_folder = "./output";              // 输出文件夹
    string output_P_path = "./output/P.csv";        // 压强输出路径
    string output_T_path = "./output/T.csv";        // 温度输出路径
    string output_v_gas_path = "./output/v_gas.csv";    // 气体速度输出路径
    string output_v_liq_path = "./output/v_liq.csv";    // 液体速度输出路径
    string output_alpha_gas_path = "./output/alpha_gas.csv";    // 气体体积分数输出路径
    string output_alpha_liq_path = "./output/alpha_liq.csv";    // 液体体积分数输出路径
    string output_cost_path = "./output/cost.csv";    // 残差输出路径
    string output_final_path = "./output/final.csv";    // 最终结果输出路径
    vector<double> pipe_pos;        // 管道位置
    vector<double> pipe_height;     // 管道相对高度

public:
    bool load_config();
    bool init();

    // 辅助函数：字符串分割
    vector<string> split(const string &str, const string &pattern);

    // 辅助函数：程序计时
    void start_timer();
    void end_timer();
};